package deep8jvmdvm;

/*
synchronized

实现细节

synchronized 既可以作用于方法，也可以作用于某一代码块。但在实现上是有区别的。 比如如下代码，使用 synchronized 作用于代码块：


javac  -encoding utf-8 TestSynchronized6.java

javap -v TestSynchronized6.class




 */

public class TestSynchronized6 {

    private int number;

    public void test1() {
        int i = 0;
        synchronized (this) {
            number = i + 1;
        }
    }

    /*


  public void test1();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=3, locals=4, args_size=1
         0: iconst_0
         1: istore_1
         2: aload_0
         3: dup
         4: astore_2
         5: monitorenter
         6: aload_0
         7: iload_1
         8: iconst_1
         9: iadd
        10: putfield      #7                  // Field number:I
        13: aload_2
        14: monitorexit
        15: goto          23
        18: astore_3
        19: aload_2
        20: monitorexit
        21: aload_3
        22: athrow
        23: return


        上面字节码中有 1 个 monitorenter 和 2 个 monitorexit。这是因为虚拟机需要保证当异常发生时也能释放锁。
        因此 2 个 monitorexit 一个是代码正常执行结束后释放锁，一个是在代码执行异常时释放锁。
            */


    public synchronized void test2() {
        int i = 0;
        i = i + 1;
    }


}
